#ifndef IVP_SOLVER_HPP
#define IVP_SOLVER_HPP

#include <Eigen/Dense>
#include <functional>

constexpr int ITE = 50;


class IVPSolver {
public:
    // 构造函数
    IVPSolver(int dim, double dt, double t0, double t1)
        : m_dim(dim), m_dt(dt), m_t0(t0), m_t1(t1) {
        m_u.resize(std::floor((m_t1 - m_t0) / dt) + 1, dim);
    }
    
    // 虚析构函数
    virtual ~IVPSolver() {}
    
    // 纯虚函数，求解初值问题
    virtual void solve(const Eigen::VectorXd &u0,
                      const std::function<Eigen::VectorXd(Eigen::VectorXd, double)> &f) = 0;
    
    // 获取解
    const Eigen::MatrixXd& getSolution() const { return m_u; }
    
    // 获取指定时间点的解
    Eigen::VectorXd getSolutionAt(int timeIndex) const {
        if (timeIndex >= 0 && timeIndex < m_u.rows()) {
            return m_u.row(timeIndex);
        }
        return Eigen::VectorXd();
    }
    
    // 获取最终时间点的解
    Eigen::VectorXd getFinalSolution() const {
        return m_u.row(m_u.rows() - 1);
    }
    
    // 获取时间参数
    double getDt() const { return m_dt; }
    double getT0() const { return m_t0; }
    double getT1() const { return m_t1; }
    int getDimension() const { return m_dim; }

protected:
    const int m_dim;   // 问题维数
    const double m_dt; // 时间步长
    const double m_t0; // 初始时间
    const double m_t1; // 终止时间
    Eigen::MatrixXd m_u; // 数值解矩阵，每行代表一个时间点的解
};

#endif // IVP_SOLVER_HPP